import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


public abstract class Transportmittel {

	private HelperListKupplung anhaengeKupplungen = null;
	private List<Grosswild> grosswild = null;
	private List<Abteil> abteile = null;
	
	public Transportmittel(List<Grosswild> grosswild, HelperListKupplung anhaengeKupplungen, List<Abteil> abteile) {
		this.grosswild = grosswild == null ? new ArrayList<Grosswild>() : grosswild;
		this.abteile = abteile == null ? new ArrayList<Abteil>() : abteile;
		this.anhaengeKupplungen = anhaengeKupplungen == null ? new HelperListKupplung() : anhaengeKupplungen;
	}
	
	/**
	 * Add all animals in this Transportmittel and in the connected Transportmittel to the given list
	 * (incl. grosswild)
	 */
	protected void addTiereToList(List<Tier> list){
		list.addAll(grosswild);
		for(Abteil a : abteile){
			if(a.getTier() != null)
				list.add(a.getTier());
		}
		for(Anhaengekupplung k : anhaengeKupplungen){
			if(k.getAnhaenger() != null)
				k.getAnhaenger().addTiereToList(list);
		}
	}
	
	/**
	 * load:
	 * 		Fuegt einen Anhaenger an die naechst leere Anhaengekupplung an.
	 * 		In der Anhaengekupplung wird eine Referenz auf den Anhaenger gesetzt,
	 * 		in dem Anhaenger wird eine Referenz auf die Kupplung gesetzt.
	 *  load nur moeglich solange mindestens eine Kupplung frei ist.
	 */
	
	protected boolean load(Anhaenger anhaenger) {
		if(anhaenger.getAnhaengekupplung() != null) {
			return false;
		}
		if(loadIntern(anhaenger) != null) {
			return true;
		}
		return false;
	}
	
	protected Anhaengekupplung loadIntern(Anhaenger anhaenger) {
		Anhaengekupplung a = anhaengeKupplungen.load(anhaenger); 
		if(a != null) {
			return a;
		}
		a = loadIntern(anhaenger, anhaengeKupplungen.iterator());
		if(a != null) {
			return a;
		}
		return null;
	}
	
	protected Anhaengekupplung loadIntern(Anhaenger anhaenger, Iterator<Anhaengekupplung> it) {
		Anhaengekupplung a = it.next();
		if(a == null) {
			return null;
		}
		Anhaengekupplung a1 = a.getAnhaenger().loadIntern(anhaenger);
		if(a1 != null) {
			return a1;
		}
		return loadIntern(anhaenger, it);
	}
	
	public static class HelperListKupplung extends HelperList<Anhaengekupplung> {
		
		public Anhaengekupplung load(Anhaenger _anhanger){
			Iterator<Anhaengekupplung> it = iterator();
			return loadIntern(_anhanger, it);
		}
		
		private Anhaengekupplung loadIntern(Anhaenger anhaenger, Iterator<Anhaengekupplung> it) {
			Anhaengekupplung a = it.next();
			if(a == null) {
				return null;
			} else {
				if(a.getAnhaenger() == null) {
					a.load(anhaenger);
					return a;
				}
			}
			return loadIntern(anhaenger, it);
		}
	}
}
